<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Cache;
use think\facade\Log;

class Task extends Command
{
    protected function configure()
    {
        $this->setName('task:run')
            ->setDescription('Run scheduled tasks');
    }

    protected function execute(Input $input, Output $output)
    {
        $output->writeln('Starting scheduled tasks...');
        
        while (true) {
            try {
                // 每分钟执行的任务
                if (date('s') == '00') {
                    $this->cleanupSessions();
                }
                
                // 每5分钟执行的任务
                if (date('i') % 5 == 0 && date('s') == '00') {
                    $this->checkPlayerStatus();
                }
                
                // 每小时执行的任务
                if (date('i') == '00' && date('s') == '00') {
                    $this->hourlyTask();
                }
                
                // 避免CPU占用过高
                sleep(1);
                
            } catch (\Exception $e) {
                Log::error('Task error: ' . $e->getMessage());
                $output->writeln('Error: ' . $e->getMessage());
            }
        }
    }
    
    /**
     * 清理过期的会话
     */
    protected function cleanupSessions()
    {
        Log::info('Cleaning up expired sessions...');
        // 清理超过2小时未活动的会话
        $expiredTime = time() - 7200;
        
        // 获取所有用户token
        $tokens = Cache::get('user_tokens', []);
        foreach ($tokens as $token => $data) {
            if ($data['last_activity'] < $expiredTime) {
                Cache::delete('user_token_' . $token);
                Log::info('Cleaned up session for token: ' . $token);
            }
        }
    }
    
    /**
     * 检查玩家状态
     */
    protected function checkPlayerStatus()
    {
        Log::info('Checking player status...');
        // 实现玩家状态检查逻辑
        // 例如：检查长时间未操作的玩家，清理僵尸连接等
    }
    
    /**
     * 每小时执行的任务
     */
    protected function hourlyTask()
    {
        Log::info('Running hourly tasks...');
        // 实现每小时需要执行的任务
        // 例如：数据统计、清理日志等
    }
} 